package com.jlboot.app.admin.interceptor;
import cn.dev33.satoken.annotation.SaCheckRole;
import cn.dev33.satoken.exception.NotPermissionException;
import cn.dev33.satoken.exception.NotRoleException;
import com.jfinal.aop.Interceptor;
import com.jfinal.aop.Invocation;
import com.jlboot.core.annotation.JlActivity;
import com.jlboot.core.annotation.JlCheckLogin;
import com.jlboot.core.annotation.JlCheckPermission;
import com.jlboot.core.annotation.JlCheckRole;
import com.jlboot.core.util.LoginUtil;
import com.jlboot.model.po.sys.SysWorkLog;
import lombok.extern.slf4j.Slf4j;

import java.lang.reflect.Method;

/**
 * Created by 51594 on 2022/7/27.
 */
@Slf4j
public class AdminAuthInterceptor implements Interceptor {

    @Override
    @SaCheckRole
    public void intercept(Invocation inv) {

        Method method=inv.getMethod();

        //校验方法登录
        JlCheckLogin methodJlCheckLogin=method.getAnnotation(JlCheckLogin.class);
        if(methodJlCheckLogin!=null){
            //判断是否登录，如果没有登录，抛出异常
            LoginUtil.checkLogin();
        }

        //校验类登录
        JlCheckLogin classJlCheckLogin=method.getDeclaringClass().getAnnotation(JlCheckLogin.class);
        if(classJlCheckLogin!=null){
            //判断是否登录，如果没有登录，抛出异常
            LoginUtil.checkLogin();
        }

        //校验类角色
        JlCheckRole methodJlCheckRole=method.getAnnotation(JlCheckRole.class);
        if(methodJlCheckRole!=null){
            String[] codes=methodJlCheckRole.code();
            if(codes!=null&&codes.length>0){
                if(!LoginUtil.hasAnyRole(codes)){
                    throw new NotRoleException(codes[0]);
                }
            }

        }

        //校验类方法角色
        JlCheckRole classJlCheckRole=method.getDeclaringClass().getAnnotation(JlCheckRole.class);
        if(classJlCheckRole!=null){
            String[] codes=classJlCheckRole.code();
            if(codes!=null&&codes.length>0){
                if(!LoginUtil.hasAnyRole(codes)){
                    throw new NotRoleException(codes[0]);
                }
            }

        }


        //校验方法权限
        JlCheckPermission methodJlCheckPermission=method.getAnnotation(JlCheckPermission.class);
        if(methodJlCheckPermission!=null){
            //判断是否有权限，如果简单不需要角色权限校验的话，此处可以注释
            if(!LoginUtil.hasAnyPermission(methodJlCheckPermission.value())){
                throw new NotPermissionException("没有访问权限");
            }
        }

        //校验类权限
        JlCheckPermission classJlCheckPermission=method.getDeclaringClass().getAnnotation(JlCheckPermission.class);
        if(classJlCheckPermission!=null){
            //判断是否有权限，如果简单不需要角色权限校验的话，此处可以注释
            if(!LoginUtil.hasAnyPermission(classJlCheckPermission.value())){
                throw new NotPermissionException("没有访问权限");
            }
        }

        //校验权限，如果jlActivity为空，则不校验权限
        JlActivity jlActivity=method.getAnnotation(JlActivity.class);
        if(jlActivity!=null){
            //记录访问日志
            if(jlActivity.log()){
                if(LoginUtil.isLogin()){
                    SysWorkLog.dao.saveLog(LoginUtil.getUserId(),jlActivity.name()
                            , LoginUtil.getUserName()+"执行了"+jlActivity.name());
                }
            }

        }


        inv.invoke();
    }

}
